/*
 * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#pragma once

#include <stdint.h>
#include <stdbool.h>
#include "esp_err.h"
#include "iot_usbh_cdc.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief AT命令处理模块配置结构体
 */
typedef struct {
    uint16_t rx_buffer_size;        /*!< 接收缓冲区大小 */
    uint16_t tx_buffer_size;        /*!< 发送缓冲区大小 */
    uint32_t default_timeout_ms;    /*!< 默认超时时间(毫秒) */
    uint8_t max_retry_count;        /*!< 最大重试次数 */
    int itf_num;                    /*!< USB接口编号 */
} at_command_config_t;

/**
 * @brief AT命令处理句柄
 */
typedef struct at_command_handler *at_command_handler_t;

/**
 * @brief AT命令响应回调函数类型
 *
 * @param handler AT命令处理句柄
 * @param response 响应数据
 * @param response_len 响应数据长度
 * @param context 用户上下文
 */
typedef void (*at_command_response_cb_t)(at_command_handler_t handler, const char *response, size_t response_len, void *context);

/**
 * @brief AT命令处理模块默认配置
 */
#define AT_COMMAND_DEFAULT_CONFIG() \
    { \
        .rx_buffer_size = 1024, \
        .tx_buffer_size = 1024, \
        .default_timeout_ms = 5000, \
        .max_retry_count = 3, \
        .itf_num = -1 \
    }

/**
 * @brief 创建AT命令处理句柄
 *
 * @param config 配置参数
 * @param[out] ret_handler 返回的AT命令处理句柄
 * @return
 *      - ESP_OK: 成功
 *      - ESP_ERR_NO_MEM: 内存不足
 *      - ESP_ERR_INVALID_ARG: 参数错误
 */
esp_err_t at_command_create(const at_command_config_t *config, at_command_handler_t *ret_handler);

/**
 * @brief 销毁AT命令处理句柄
 *
 * @param handler AT命令处理句柄
 * @return
 *      - ESP_OK: 成功
 */
esp_err_t at_command_destroy(at_command_handler_t handler);

/**
 * @brief 发送AT命令并等待响应
 *
 * @param handler AT命令处理句柄
 * @param command AT命令字符串
 * @param response 响应缓冲区，如果为NULL则不返回响应
 * @param response_len 响应缓冲区长度
 * @param timeout_ms 超时时间(毫秒)
 * @return
 *      - ESP_OK: 成功
 *      - ESP_ERR_TIMEOUT: 超时
 *      - ESP_ERR_INVALID_STATE: 模块未初始化
 *      - ESP_FAIL: 其他错误
 */
esp_err_t at_command_send(at_command_handler_t handler, const char *command, char *response, size_t response_len, uint32_t timeout_ms);

/**
 * @brief 异步发送AT命令
 *
 * @param handler AT命令处理句柄
 * @param command AT命令字符串
 * @param callback 响应回调函数
 * @param context 用户上下文
 * @param timeout_ms 超时时间(毫秒)
 * @return
 *      - ESP_OK: 成功发送
 *      - ESP_ERR_INVALID_STATE: 模块未初始化
 *      - ESP_FAIL: 其他错误
 */
esp_err_t at_command_send_async(at_command_handler_t handler, const char *command, at_command_response_cb_t callback, void *context, uint32_t timeout_ms);

/**
 * @brief 检查AT命令接口是否已连接
 *
 * @param handler AT命令处理句柄
 * @return
 *      - true: 已连接
 *      - false: 未连接
 */
bool at_command_is_connected(at_command_handler_t handler);

/**
 * @brief 重置AT命令接口
 *
 * @param handler AT命令处理句柄
 * @return
 *      - ESP_OK: 成功
 *      - ESP_ERR_INVALID_STATE: 模块未初始化
 */
esp_err_t at_command_reset(at_command_handler_t handler);

#ifdef __cplusplus
}
#endif